/**
 *******************************************************************************
 * @file user_gpio_conf.h
 * @author .ISS_AUTO (hudandan@issauto.com)
 * @brief 功能: DI检测 + 按键检测(可使能开启)
 *        MCU: N32G45x
 *
 * @date 2023-05-24    创建
 *       2023-06-07    移植MCU-N32G45x
 *
 * @copyright Copyright (c) 2023 ISSAUTO TECH Co., Ltd. All rights reserved.
 *
 *******************************************************************************
 */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __GPIO_CONF_H
#define __GPIO_CONF_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "user_global.h"

/* Exported types ------------------------------------------------------------*/
/**
 * 定义键值代码, 必须按如下次序定时每个键的按下、弹起和长按事件
 *
 * 推荐使用enum, 不用#define，原因：
 * (1) 便于新增键值,方便调整顺序，使代码看起来舒服点
 * (2) 编译器可帮我们避免键值重复。
 */
typedef enum {
    KEY_NONE = 0, /* 0 表示按键事件 */

    KEY_DOWN_1,  /* 1 1键按下 */
    KEY_UP_1,    /* 2 1键弹起 */
    KEY_LONG_1,  /* 3 1键长按 */

    KEY_DOWN_2, /* 4 2键按下 */
    KEY_UP_2,   /* 5 2键弹起 */
    KEY_LONG_2, /* 6 2键长按 */

    KEY_DOWN_3,  /* 7 3键按下 */
    KEY_UP_3,    /* 8 3键弹起 */
    KEY_LONG_3,  /* 9 3键长按 */

    KEY_DOWN_4, /* 10 4键按下 */
    KEY_UP_4,   /* 11 4键弹起 */
    KEY_LONG_4, /* 12 4键长按 */

    KEY_DOWN_5, /* 13 5键按下 */
    KEY_UP_5,   /* 14 5键弹起 */
    KEY_LONG_5, /* 15 5键长按 */

    KEY_DOWN_6, /* 16 6键按下 */
    KEY_UP_6,   /* 17 6键弹起 */
    KEY_LONG_6, /* 18 6键长按 */

    // 按需求补充...

} Key_Func_e;

/**
 * 根据在实际应用中 Button 的个数, 如下次序补齐 BUTTON_ID_X 编号（注：Button总数量必须与实际使用总数量保持一致！）
 *
 * 推荐使用enum, 不用#define，原因：
 * (1) 便于新增键值,方便调整顺序，使代码看起来舒服点
 * (2) 编译器可帮我们避免键值重复。
 */
typedef enum {
    BUTTON_ID_1 = 0,
    BUTTON_ID_2,
    BUTTON_ID_3,
    BUTTON_ID_4,
    BUTTON_ID_5,
    BUTTON_ID_6,

    // 按需求补充...

    BUTTON_MAX_NUM,

    BUTTON_ID_INVALID = 0xFF
} BUTTON_ID_E;

/**
 * 根据在实际应用中 INPUT GPIO 的个数, 如下次序补齐 DI_ID_X 编号（注：INPUT总数量必须与实际使用总数量保持一致！）
 *
 * 推荐使用enum, 不用#define，原因：
 * (1) 便于新增键值,方便调整顺序，使代码看起来舒服点
 * (2) 编译器可帮我们避免键值重复。
 */
typedef enum {
    DI_ID_1 = 0,
    DI_ID_2,
    DI_ID_3,
    DI_ID_4,
    DI_ID_5,
    DI_ID_6,
    DI_ID_7,
    DI_ID_8,
    DI_ID_9,
    DI_ID_10,

    // 按需求补充...

    DI_MAX_NUM
} DevDI_ID_E;

/* Exported constants --------------------------------------------------------*/
#define BUTTONS_CNT_NUM    0U    /*!< BUTTONS_CNT_NUM: BUTTON定义总数 (0：则关闭按键检测功能) */
#define GPIO_DI_CNT_NUM    4U   /*!< GPIO_DI_CNT_NUM: 输入引脚定义总数 */

/* Exported macro ------------------------------------------------------------*/

/*======================================================================
                ↓↓↓ GPIO Input 配置相关宏定义 (自定义修改) ↓↓↓
======================================================================*/

#if (GPIO_DI_CNT_NUM)

/**
 * @brief 实际应用中 INPUT GPIO 的寄存器配置
 *
 * @example GPIO_PORT_DI_1       GPIOA
 *          GPIO_BIT_DI_1        GPIO_PIN_8
 *          PORT_FUNC_DI_1       PORTA4_FUNC_A4 ( 正常模式下功能定义 )
 *          PIN_TO_PMU_DI_1      1U ( 0: 正常模式; 1: 低功耗模式 )
 *          PIN_EN_WKUP_DI_1     0U ( 0: 关闭输入唤醒功能; 1: 开启输入唤醒功能 )
 */

/* Pin of User Application */

/** Configure Input GPIO pins:
 * PA11	DI1	K1  按键启动
 * PA10	DI2	K2  机械钥匙
 * PB13	DI3	K3	座椅传感器
 * PA9	DI4	K4  急停按键 (低功耗唤醒)
 */

/* DI_ID_1 (PA11) */
#define GPIO_PORT_DI_1      GPIOA
#define GPIO_BIT_DI_1       GPIO_PIN_11

/* DI_ID_2 (PA10) */
#define GPIO_PORT_DI_2      GPIOA
#define GPIO_BIT_DI_2       GPIO_PIN_10

/* DI_ID_3 (PB13) */
#define GPIO_PORT_DI_3      GPIOB
#define GPIO_BIT_DI_3       GPIO_PIN_13

/* DI_ID_4 (PA9) */
#define GPIO_PORT_DI_4      GPIOA
#define GPIO_BIT_DI_4       GPIO_PIN_9



/** @brief Read the selected data port bit.
 */
#define GPIO_READ_BIT_DI_X(x)        GPIO_ReadInputDataBit(GPIO_PORT_DI_##x, GPIO_BIT_DI_##x)


/**
 * @brief 各 INPUT 在实际应用中的相关宏定义, 用户自定义
 *
 */
/* Pin define of User Application */

/** Configure Input GPIO pins:
 * PA11	DI1	K1  按键启动
 * PA10	DI2	K2  机械钥匙
 * PA9	DI3	K4  急停按键 (低功耗唤醒)
 * PB13	DI4	K3	座椅传感器
 */

/* DI_ID_1 -> K1 */
#define DI_K1             DI_ID_1
#define GPIO_PORT_K1      GPIO_PORT_DI_1
#define GPIO_BIT_K1       GPIO_BIT_DI_1
#define K1_GET()          GPIO_READ_BIT_DI_X(1)

/* DI_ID_2 -> K2 */
#define DI_K2             DI_ID_2
#define GPIO_PORT_K2      GPIO_PORT_DI_2
#define GPIO_BIT_K2       GPIO_BIT_DI_2
#define K2_GET()          GPIO_READ_BIT_DI_X(2)

/* DI_ID_3 -> K3 */
#define DI_K3             DI_ID_3
#define GPIO_PORT_K3      GPIO_PORT_DI_3
#define GPIO_BIT_K3       GPIO_BIT_DI_3
#define K3_GET()          GPIO_READ_BIT_DI_X(3)

/* DI_ID_4 -> K4 */
#define DI_K4             DI_ID_4
#define GPIO_PORT_K4      GPIO_PORT_DI_4
#define GPIO_BIT_K4       GPIO_BIT_DI_4
#define K4_GET()          GPIO_READ_BIT_DI_X(4)

#endif

#if (BUTTONS_CNT_NUM)

/**
* @brief 各 BUTTON 在实际应用中的 按键编号 以及 键值 的定义
*
*/
#define BUTTON_ID_PEDAL          BUTTON_ID_1
#define KEY_DOWN_PEDAL           KEY_DOWN_1
#define KEY_UP_PEDAL             KEY_UP_1
#define KEY_LONG_PEDAL           KEY_LONG_1

#endif


/*======================================================================
                ↓↓↓ GPIO Output 配置相关宏定义 (自定义修改) ↓↓↓
======================================================================*/

/**
 * @brief 实际应用中 OUTPUT GPIO 的寄存器配置
 *
 * @example GPIO_PORT_DO_1          GPIOA
 *          GPIO_BIT_DO_1           GPIO_PIN_0
 *          GPIO_BIT_SET_DO_1(n)    GPIO_WriteBit(GPIO_PORT_DO_1, GPIO_BIT_DO_1, n)
 */

/* Pin of User Application */

/** Configure Output GPIO pins:
 * PB10	DO2	A1  前大灯近
 * PA4	DO1	A2  前大灯远
 * PB2	DO3	A3  左转向灯
 * PA5	DO4	A4  右转向灯
 * PA7	DO6	A5  倒车喇叭
 * PA6	DO5	A6  尾灯
 * PB12	DO7	H1	喇叭
 *
 * PB3	DO8	CAN1_STB
 */

/* DO_ID_1 (PB10 -> A1  前大灯近) */
#define GPIO_PORT_DO_1          GPIOB
#define GPIO_BIT_DO_1           GPIO_PIN_10

/* DO_ID_2 (PA4 -> A2 前大灯远) */
#define GPIO_PORT_DO_2          GPIOA
#define GPIO_BIT_DO_2           GPIO_PIN_4

/* DO_ID_3 (PB2 -> A3  左转向灯) */
#define GPIO_PORT_DO_3          GPIOB
#define GPIO_BIT_DO_3           GPIO_PIN_2

/* DO_ID_4 (PA5 -> A4  右转向灯) */
#define GPIO_PORT_DO_4          GPIOA
#define GPIO_BIT_DO_4           GPIO_PIN_5

/* DO_ID_5 (PA7 -> A5  倒车喇叭) */
#define GPIO_PORT_DO_5          GPIOA
#define GPIO_BIT_DO_5           GPIO_PIN_7

/* DO_ID_6 (PA6 -> A6  尾灯) */
#define GPIO_PORT_DO_6          GPIOA
#define GPIO_BIT_DO_6           GPIO_PIN_6

/* DO_ID_7 (PB12 -> H1	喇叭) */
#define GPIO_PORT_DO_7          GPIOB
#define GPIO_BIT_DO_7           GPIO_PIN_12

/* DO_ID_8 (PB3 -> CAN1_STB) */
#define GPIO_PORT_DO_8          GPIOB
#define GPIO_BIT_DO_8           GPIO_PIN_3


/** @brief Sets or clears the selected data port bit.
 */
#define GPIO_WRITE_BIT_DO_X(x, n)        GPIO_WriteBit(GPIO_PORT_DO_##x, GPIO_BIT_DO_##x, (Bit_OperateType)n)

#define GPIO_SET_BIT_DO_X(x)             GPIO_PORT_DO_##x->PBSC = GPIO_BIT_DO_##x
#define GPIO_RESET_BIT_DO_X(x)           GPIO_PORT_DO_##x->PBC  = GPIO_BIT_DO_##x


/**
 * @brief 各 OUTPUT 在实际应用中的相关宏定义, 用户自定义
 *
 */

/* Pin define of User Application */

/** Configure Output GPIO pins:
 * PB10	DO2	A1  前大灯近
 * PA4	DO1	A2  前大灯远
 * PB2	DO3	A3  左转向灯
 * PA5	DO4	A4  右转向灯
 * PA7	DO6	A5  倒车喇叭
 * PA6	DO5	A6  尾灯
 * PB12	DO7	H1	喇叭
 *
 * PB3	DO8	CAN1_STB
 */

/* DO_ID_1 -> A1 */
#define A1_SET(n)         GPIO_WRITE_BIT_DO_X(1, n)
#define A1_HIGH()         GPIO_RESET_BIT_DO_X(1)
#define A1_LOW()          GPIO_SET_BIT_DO_X(1)

/* DO_ID_2 -> A2 */
#define A2_SET(n)         GPIO_WRITE_BIT_DO_X(2, n)
#define A2_HIGH()         GPIO_RESET_BIT_DO_X(2)
#define A2_LOW()          GPIO_SET_BIT_DO_X(2)

/* DO_ID_3 -> A3 */
#define A3_SET(n)         GPIO_WRITE_BIT_DO_X(3, n)
#define A3_HIGH()         GPIO_RESET_BIT_DO_X(3)
#define A3_LOW()          GPIO_SET_BIT_DO_X(3)

/* DO_ID_4 -> A4 */
#define A4_SET(n)         GPIO_WRITE_BIT_DO_X(4, n)
#define A4_HIGH()         GPIO_RESET_BIT_DO_X(4)
#define A4_LOW()          GPIO_SET_BIT_DO_X(4)

/* DO_ID_5 -> A5 */
#define A5_SET(n)         GPIO_WRITE_BIT_DO_X(5, n)
#define A5_HIGH()         GPIO_RESET_BIT_DO_X(5)
#define A5_LOW()          GPIO_SET_BIT_DO_X(5)

/* DO_ID_6 -> A6 */
#define A6_SET(n)         GPIO_WRITE_BIT_DO_X(6, n)
#define A6_HIGH()         GPIO_RESET_BIT_DO_X(6)
#define A6_LOW()          GPIO_SET_BIT_DO_X(6)

/* DO_ID_7 -> H1 */
#define H1_SET(n)         GPIO_WRITE_BIT_DO_X(7, n)
#define H1_HIGH()         GPIO_RESET_BIT_DO_X(7)
#define H1_LOW()          GPIO_SET_BIT_DO_X(7)


/* DO_ID_8 -> CAN1_STB */
#define CAN1_STB_SET(n)   GPIO_WRITE_BIT_DO_X(8, n)
#define CAN1_STB_HIGH()   GPIO_SET_BIT_DO_X(8)
#define CAN1_STB_LOW()    GPIO_RESET_BIT_DO_X(8)



#ifdef __cplusplus
}
#endif

#endif /* __GPIO_CONF_H */

/* END OF FILE ---------------------------------------------------------------*/
